package com.heatup.apt.common.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Map;

public class ReflectUtil {
	
	/**
	 * 通过反射执行Bean中的方法-带参数
	 * @param bean
	 * @param method
	 * @param param
	 * @throws Exception
	 */
	public static void invokeBeanMethodRs(Object bean,String method,Object param) throws Exception{
		Class<? extends Object> clazz = bean.getClass();
		Method meth = clazz.getDeclaredMethod(method, Map.class);
		meth.invoke(bean, param);
	}
	
	/**
	 * 通过反射执行Bean中的方法
	 * @param bean
	 * @param method
	 * @throws Exception
	 */
	public static void invokeBeanMethodRs(Object bean,String method) throws Exception{
		Class<? extends Object> clazz = bean.getClass();
		Method meth = clazz.getDeclaredMethod(method, (Class[])null);
		meth.invoke(bean);
	}
	
	/**
	 * 通过反射执行Bean中的方法-带参数及返回值
	 * @param bean
	 * @param method
	 * @param param
	 * @return
	 * @throws Exception
	 */
	public static Object invokeBeanMethod(Object bean,String method,Map<String, Object> param) throws Exception{
		
		Class<? extends Object> clazz = bean.getClass();
		Method meth = clazz.getDeclaredMethod(method, Map.class);
		return meth.invoke(bean, param);
	}
	
	/**
	 * 通过反射执行Bean中的方法-带参数及返回值
	 * @param bean
	 * @param method
	 * @param param
	 * @return
	 * @throws Exception
	 */
	public static Object invokeBeanMethod(Object bean,String method,Object param) throws Exception{
		
		Class<? extends Object> clazz = bean.getClass();
		Method meth = clazz.getDeclaredMethod(method, Object.class);
		return meth.invoke(bean, param);
	}
	
	/**
	 * 通过反射执行Bean中的方法-返回值
	 * @param bean
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public static Object invokeBeanMethod(Object bean,String method) throws Exception{
		Class<? extends Object> clazz = bean.getClass();
		Method meth = clazz.getDeclaredMethod(method, (Class[])null);
		return meth.invoke(bean);
	}
	
	public static void setFieldValue(Object target, String fname, Class ftype, Object fvalue) { //设置字段值  如：username 字段,setUsername(String username)
	                             if (target == null  
	                                     || fname == null  
	                                     || "".equals(fname)   
	                                     || (fvalue != null && !ftype.isAssignableFrom(fvalue.getClass()))) {//如果类型不匹配，直接退出 
	                                 return;   
	                             }   
	                             Class clazz = target.getClass();   
	                             try {  //先通过setXxx()方法设置类属性值
	                              String methodname="set"  + Character.toUpperCase(fname.charAt(0)) + fname.substring(1);
	                              System.out.println(methodname);
	                                 Method method = clazz.getDeclaredMethod(methodname, ftype); //获取定义的方法
	                                 if (!Modifier.isPublic(method.getModifiers())) {   //设置非共有方法权限
	                                     method.setAccessible(true);   
	                                 }   
	                                 method.invoke(target, fvalue);  //执行方法回调
	                             } catch (Exception me) {//如果set方法不存在，则直接设置类属性值
//	                                 if (logger.isDebugEnabled()) {   
//	                                     logger.debug(me);   
//	                                 }   
	                                 try {   
	                                     Field field = clazz.getDeclaredField(fname);   //获取定义的类属性
	                                     if (!Modifier.isPublic(field.getModifiers())) {   //设置非共有类属性权限
	                                         field.setAccessible(true);   
	                                     }   
	                                     field.set(target, fvalue); //设置类属性值
	                                     
	                                 } catch (Exception fe) {   
//	                                     if (logger.isDebugEnabled()) {   
//	                                         logger.debug(fe);   
//	                                     }   
	                                 }   
	                             }   
	                         }   
	                         public static Object getFieldValue(Object target, String fname, Class ftype  
	                                ) {//获取字段值  如：username 字段,getUsername()
	                          if (target == null  
	                                     || fname == null  
	                                     || "".equals(fname)   
	                                     ) {   
	                                 return null;   
	                             }   
	                          Class clazz = target.getClass();   
	                             try {   //先通过getXxx()方法获取类属性值
	                              String methodname="get"  + Character.toUpperCase(fname.charAt(0)) + fname.substring(1);
	                              System.out.println(methodname);
	                                 Method method = clazz.getDeclaredMethod(methodname); //获取定义的方法
	                                 if (!Modifier.isPublic(method.getModifiers())) {   //设置非共有方法权限
	                                     method.setAccessible(true);   
	                                 }   
	                                 return method.invoke(target); //方法回调，返回值  
	                             } catch (Exception me) {//如果get方法不存在，则直接获取类属性值
//	                                 if (logger.isDebugEnabled()) {   
//	                                     logger.debug(me);   
//	                                 }   
	                                 try {   
	                                     Field field = clazz.getDeclaredField(fname);   //获取定义的类属性
	                                     if (!Modifier.isPublic(field.getModifiers())) {    //设置非共有类属性权限
	                                         field.setAccessible(true);   
	                                     }   
	                                     return field.get(target);//返回类属性值
	                                 } catch (Exception fe) {   
//	                                     if (logger.isDebugEnabled()) {   
//	                                         logger.debug(fe);   
//	                                     }   
	                                 }   
	                             }  
	                             return null;
	                         }
}
